﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Promocot.Models;
using System.IO;
using System.Web.Script.Serialization;
using iTextSharp.text.html.simpleparser;
using System.Web.UI;
using System.Text;
using System.Web.Helpers;

namespace Promocot.Controllers
{
    public class CotizacionController : Controller
    {
        //
        // GET: /Cotizacion/
        ClientomaticDBContainer almacen = new ClientomaticDBContainer();

        public ActionResult Index()
        {
            Session.Add("accion", "Index");
            Session.Remove("filtro");
            int anio = DateTime.Now.Year;
            List<SelectListItem> nuevo = new List<SelectListItem>();
            for (int i = 0; i < 6; i++)
            {
                nuevo.Add(new SelectListItem() { Text = "" + (anio + i), Value = "" + (anio + i) });
            }
            ViewBag.destinos = almacen.DestinoSet.OrderBy(a=>a.num_destino).ToList<Destino>();
            ViewBag.temporadas = almacen.TemporadaSet.ToList<Temporada>();
            ViewBag.anios = nuevo;
            List<Usuario> losUsuarios = new List<Usuario>();
            losUsuarios.Add(new Usuario { cod_usuario = 0, nombre = " " });
            losUsuarios.AddRange(almacen.UsuarioSet.ToList<Usuario>());
            ViewBag.asesores = losUsuarios;

            return View();
        }

        public ActionResult MostrarPromos()
        {
            List<Promocion> todasPromociones = almacen.PromocionSet.ToList<Promocion>();
            return PartialView(todasPromociones);
        }

        public ActionResult MostrarCotizaciones()
        {
            try
            {
                int idUsuario = (int)Session["usuarioID"];
                return PartialView(almacen.CotizacionSet.Where(cot => !cot.eliminado && !cot.status.Equals(Status.plantilla) && cot.Usuario.cod_usuario == idUsuario && cot.Usuario.activo).OrderByDescending(cot => cot.Id).ToList<Cotizacion>());
            }
            catch (NullReferenceException)
            {
                return RedirectToAction("Index", "home");
            }
        }

        public ActionResult MostrarCotizacionesPlantilla()
        {
            return PartialView(almacen.CotizacionSet.Where(cot => !cot.eliminado && cot.status.Equals(Status.plantilla) && cot.Usuario.activo).OrderByDescending(cot => cot.Id).ToList<Cotizacion>());
        }

        public ActionResult OperacionFiltrar(FormCollection form)
        {

            /*
                Zona para manejar los datos del filtro
                
             */

            List<Promocion> todasPromociones = almacen.PromocionSet.Where(pro => !pro.eliminado).ToList<Promocion>();
            return PartialView("MostrarPromos", todasPromociones);
        }

        public ActionResult nueva()
        {
            Session.Add("accion", "nueva");

            int anio = DateTime.Now.Year;
            List<SelectListItem> nuevo = new List<SelectListItem>();
            for (int i = 0; i < 6; i++)
            {
                nuevo.Add(new SelectListItem() { Text = "" + (anio + i), Value = "" + (anio + i) });
            }

            Destino blancoDestino = new Destino
            {
                nombre_destino = "Seleccione un destino"
            };

            Temporada blancoTemporada = new Temporada
            {
                nombre_temporada = " "
            };


            List<Destino> destinos = almacen.DestinoSet.ToList<Destino>();
            destinos.Add(blancoDestino);

            List<Temporada> temporadas = almacen.TemporadaSet.ToList<Temporada>();
            temporadas.Add(blancoTemporada);

            ViewBag.destinos = destinos.OrderBy(des => des.num_destino).ToList<Destino>();


            ViewBag.temporadas = temporadas.OrderBy(tem => tem.Id).ToList<Temporada>();
            ViewBag.anios = nuevo;
            ViewBag.asesores = almacen.UsuarioSet.ToList<Usuario>();
            vistaCotizacion nueva_cotizacion = new vistaCotizacion();
            nueva_cotizacion.nueva = new Cotizacion();
            nueva_cotizacion.nueva.Destino = new Destino();
            //Aqui colocamos la informacion del asesor
            try
            {
                int id = (int)Session["usuarioID"];
                nueva_cotizacion.nueva.Usuario = almacen.UsuarioSet.Where(usu => usu.cod_usuario == id).Single<Usuario>();
            }
            catch (NullReferenceException) {
                return RedirectToAction("Index", "Home");
            }

            return View(nueva_cotizacion);
        }

        [HttpPost]
        [ValidateInput(false)]
        public ActionResult registrarCotizacion(vistaCotizacion aRegistrar)
        {
            int idTemporada = aRegistrar.nueva.Temporada.Id;
            int idDestino = aRegistrar.nueva.Destino.Id;
            int idUsuario = aRegistrar.nueva.Usuario.cod_usuario;
            Cotizacion plantilla = null;
            Cotizacion final = null;
            /*Ok, codigo para generar una cotizacion de tipo "plantilla" nueva
             * Reviso si el el campo hijo de es 0 o no...
             */

            try
            {
                if (String.IsNullOrEmpty(aRegistrar.nueva.fecha_inicio.ToString()) || String.IsNullOrEmpty(aRegistrar.nueva.noches.ToString()) || aRegistrar.nueva.noches <= 0)
                {
                    return JavaScript("alert('Inserte la fecha de inicio y el número de noches.')");
                }

                Cliente buscar = almacen.ClienteSet.Where(model => model.email == aRegistrar.nuevoCliente.email).FirstOrDefault<Cliente>();
                Int32 idCliente = (buscar != null) ? buscar.Id : 0;


                if (idCliente == 0)
                {
                    almacen.ClienteSet.AddObject(aRegistrar.nuevoCliente);
                    almacen.SaveChanges();
                }
                else
                {
                    aRegistrar.nuevoCliente = buscar;
                }

                if (aRegistrar.nueva.Id == 0)
                {
                    final = new Cotizacion();
                    final.Cliente = aRegistrar.nuevoCliente;
                    final.descripcion_html = aRegistrar.nueva.descripcion_html;
                    final.Destino = almacen.DestinoSet.Where(des => des.Id == idDestino).Single<Destino>();
                    final.observaciones = aRegistrar.nueva.observaciones;
                    final.precio_referencial = aRegistrar.nueva.precio_referencial;
                    final.status = Status.borrador;//La primera vez que se crea la cotizacion, es una plantilla.
                    final.Temporada = almacen.TemporadaSet.Where(tem => tem.Id == idTemporada).Single<Temporada>();
                    final.texto_intro = aRegistrar.nueva.texto_intro;
                    final.titulo_cotizacion = aRegistrar.nueva.titulo_cotizacion;
                    final.Usuario = almacen.UsuarioSet.Where(usu => usu.cod_usuario == idUsuario).Single<Usuario>();
                    final.year = aRegistrar.nueva.year;
                    final.incluye = aRegistrar.nueva.incluye;
                    final.noincluye = aRegistrar.nueva.noincluye;
                    final.eliminado = false;
                    final.fecha = DateTime.Now;
                    final.fecha_inicio = aRegistrar.nueva.fecha_inicio;
                    final.fecha_fin = aRegistrar.nueva.fecha_fin;
                    final.noches = aRegistrar.nueva.noches;
                    final.formateado = aRegistrar.nueva.formateado;
                    final.imagenes_adicionales = aRegistrar.nueva.imagenes_adicionales;

                    if (aRegistrar.nueva.eshijode == 0)
                    {
                        final.eshijode = aRegistrar.nueva.Id;//Esto es un error garrafal
                    }

                    final.eshijode = aRegistrar.nueva.eshijode;

                    if (ModelState.IsValid)
                    {
                        almacen.CotizacionSet.AddObject(final);
                        almacen.SaveChanges();
                        //Creo un Directorio con el nombre de la cotizacion.
                        Directory.CreateDirectory(this.Server.MapPath("~/Content/Recursos") + "/cotizacion" + final.Id.ToString());
                    }

                }
                else
                {
                    final = almacen.CotizacionSet.Where(cot => cot.Id == aRegistrar.nueva.Id).Single<Cotizacion>();
                    final.Cliente = aRegistrar.nuevoCliente;
                    final.descripcion_html = aRegistrar.nueva.descripcion_html;
                    final.Destino = almacen.DestinoSet.Where(des => des.Id == idDestino).Single<Destino>();
                    final.observaciones = aRegistrar.nueva.observaciones;
                    final.precio_referencial = aRegistrar.nueva.precio_referencial;
                    final.status = final.status;
                    final.Temporada = almacen.TemporadaSet.Where(tem => tem.Id == idTemporada).Single<Temporada>();
                    final.texto_intro = aRegistrar.nueva.texto_intro;
                    final.titulo_cotizacion = aRegistrar.nueva.titulo_cotizacion;
                    final.Usuario = almacen.UsuarioSet.Where(usu => usu.cod_usuario == idUsuario).Single<Usuario>();
                    final.year = aRegistrar.nueva.year;
                    final.incluye = aRegistrar.nueva.incluye;
                    final.noincluye = aRegistrar.nueva.noincluye;
                    final.eliminado = false;
                    final.fecha = DateTime.Now;
                    final.fecha_inicio = aRegistrar.nueva.fecha_inicio;
                    final.fecha_fin = aRegistrar.nueva.fecha_fin;
                    final.noches = aRegistrar.nueva.noches;
                    final.formateado = aRegistrar.nueva.formateado;
                    final.imagenes_adicionales = aRegistrar.nueva.imagenes_adicionales;
                    if (TryUpdateModel(final))
                    {
                        almacen.SaveChanges();

                        if (final.status.Equals(Status.plantilla))
                        {


                            //agrego primero las caracteristicas que la hacen
                            //ser una plantilla
                            plantilla = new Cotizacion();
                            plantilla.status = Status.plantilla;//Ver el archivo Views/Cotizacion/nueva.cshtml, el 1 corresponde al tipo "Plantilla";
                            plantilla.eshijode = 0;
                            plantilla.descripcion_html = aRegistrar.nueva.descripcion_html;
                            plantilla.Destino = almacen.DestinoSet.Where(des => des.Id == idDestino).Single<Destino>();
                            plantilla.observaciones = aRegistrar.nueva.observaciones;
                            plantilla.precio_referencial = aRegistrar.nueva.precio_referencial;
                            plantilla.Temporada = almacen.TemporadaSet.Where(tem => tem.Id == idTemporada).Single<Temporada>();
                            plantilla.texto_intro = aRegistrar.nueva.texto_intro;
                            plantilla.titulo_cotizacion = aRegistrar.nueva.titulo_cotizacion;
                            plantilla.Usuario = almacen.UsuarioSet.Where(usu => usu.cod_usuario == idUsuario).Single<Usuario>();
                            plantilla.year = aRegistrar.nueva.year;
                            plantilla.incluye = aRegistrar.nueva.incluye;
                            plantilla.noincluye = aRegistrar.nueva.noincluye;
                            plantilla.eliminado = false;
                            plantilla.fecha = DateTime.Now;
                            plantilla.noches = aRegistrar.nueva.noches;
                            plantilla.formateado = aRegistrar.nueva.formateado;
                            plantilla.imagenes_adicionales = aRegistrar.nueva.imagenes_adicionales;
                            almacen.CotizacionSet.AddObject(plantilla);
                            almacen.SaveChanges();

                        }

                    }
                }

                String direccion = "http://" + Request.Url.Authority + "/Cotizacion/PreviewCot/" + final.Id;
                return JavaScript("alert('Actualizada la cotizacion: " + final.Id + "');$('#idCot').val(" + final.Id + ");$('#preview').html('<a href=\"" + direccion + "\">Vista Previa</a>');$('#zona_imagen, #preview').fadeIn();");


            }
            catch (Exception)
            {
                return JavaScript("alert('Debe colocar informacion en los campos de: Cliente, Título, Temporada, Destino e Información de cotización.')");
            }
        }

        public ActionResult filtrarCotizaciones(FormCollection form)
        {
            Session.Add("filtro", "si");
            int anio = DateTime.Now.Year;
            List<SelectListItem> nuevo = new List<SelectListItem>();
            for (int i = 0; i < 6; i++)
            {
                nuevo.Add(new SelectListItem() { Text = "" + (anio + i), Value = "" + (anio + i) });
            }
            ViewBag.destinos = almacen.DestinoSet.OrderBy(a => a.num_destino).ToList<Destino>();
            ViewBag.temporadas = almacen.TemporadaSet.ToList<Temporada>();
            ViewBag.anios = nuevo;
            ViewBag.asesores = almacen.UsuarioSet.ToList<Usuario>();

            List<Cotizacion> todos = almacen.CotizacionSet.Where(cot => !cot.eliminado && cot.Usuario.activo).ToList<Cotizacion>();

            if (!String.IsNullOrEmpty(form.Get("destino")))
            {
                int iddestino = int.Parse(form.Get("destino"));
                foreach (var cot in todos.ToList<Cotizacion>())
                {
                    if (cot.Destino.Id != iddestino)
                    {
                        todos.Remove(cot);
                    }
                }
            }

            if (!String.IsNullOrEmpty(form.Get("temporada")))
            {
                int idtemporada = int.Parse(form.Get("temporada"));
                foreach (var cot in todos.ToList<Cotizacion>())
                {
                    if (cot.Temporada.Id != idtemporada)
                    {
                        todos.Remove(cot);
                    }
                }
            }

            if (!String.IsNullOrEmpty(form.Get("anio")))
            {
                int year = int.Parse(form.Get("anio"));
                foreach (var cot in todos.ToList<Cotizacion>())
                {
                    if (cot.year != year)
                    {
                        todos.Remove(cot);
                    }
                }
            }

            if (!String.IsNullOrEmpty(form.Get("titulo")))
            {

                foreach (var cot in todos.ToList<Cotizacion>())
                {
                    if (!cot.titulo_cotizacion.Contains(form.Get("titulo")))
                    {
                        todos.Remove(cot);
                    }
                }
            }


            if (form.Get("accion").Equals("nuevaCotPlantilla"))
            {
                foreach (var cot in todos.ToList<Cotizacion>())
                {
                    if (!cot.status.Equals(Status.plantilla))
                    {
                        todos.Remove(cot);
                    }
                }
            }
            else
            {

                foreach (var cot in todos.ToList<Cotizacion>())
                {
                    if (cot.status.Equals(Status.plantilla))
                    {
                        todos.Remove(cot);
                    }
                }

            }



            todos.OrderByDescending(model => model.Id);
            return PartialView("MostrarCotizaciones", todos);
        }

        public ActionResult filtrarCotizaciones2(FormCollection form)
        {
            Session.Add("filtro", "si");
            int anio = DateTime.Now.Year;
            List<SelectListItem> nuevo = new List<SelectListItem>();
            for (int i = 0; i < 6; i++)
            {
                nuevo.Add(new SelectListItem() { Text = "" + (anio + i), Value = "" + (anio + i) });
            }
            ViewBag.destinos = almacen.DestinoSet.OrderBy(a => a.num_destino).ToList<Destino>();
            ViewBag.temporadas = almacen.TemporadaSet.ToList<Temporada>();

            ViewBag.anios = nuevo;
            List<Usuario> losUsuarios = new List<Usuario>();
            losUsuarios.Add(new Usuario { cod_usuario = 0, nombre = " " });
            losUsuarios.AddRange(almacen.UsuarioSet.ToList<Usuario>());
            ViewBag.asesores = losUsuarios;
            int idusuario = int.Parse(form.Get("asesores"));


            

            String status = form.Get("status");

            if (idusuario == 0 && status.Equals("-1")) {

                if (!form.Get("accion").Equals("nuevaCotPlantilla"))
                {
                    return PartialView("MostrarCotizaciones", almacen.CotizacionSet.Where(cot => !cot.status.Equals(Status.plantilla) && !cot.eliminado && cot.Usuario.activo).OrderByDescending(cot => cot.Id).ToList<Cotizacion>());
                }
                else
                {
                    return PartialView("MostrarCotizaciones", almacen.CotizacionSet.Where(cot =>cot.status.Equals(Status.plantilla) && !cot.eliminado && cot.Usuario.activo).ToList<Cotizacion>());
                }
            
                
            }else if(status.Equals("-1")){


                if (!form.Get("accion").Equals("nuevaCotPlantilla"))
                {
                    return PartialView("MostrarCotizaciones", almacen.CotizacionSet.Where(cot => cot.Usuario.cod_usuario == idusuario && !cot.status.Equals(Status.plantilla)  && !cot.eliminado && cot.Usuario.activo).OrderByDescending(cot => cot.Id).ToList<Cotizacion>());
                }
                else
                {
                    return PartialView("MostrarCotizaciones", almacen.CotizacionSet.Where(cot => cot.Usuario.cod_usuario == idusuario && cot.status.Equals(Status.plantilla)  && !cot.eliminado && cot.Usuario.activo).ToList<Cotizacion>());
                }



            }
            else if (idusuario == 0)
            {

                if (!form.Get("accion").Equals("nuevaCotPlantilla"))
                {
                    return PartialView("MostrarCotizaciones", almacen.CotizacionSet.Where(cot =>  !cot.status.Equals(Status.plantilla) && cot.status.Equals(status) && !cot.eliminado && cot.Usuario.activo).OrderByDescending(cot => cot.Id).ToList<Cotizacion>());
                }
                else
                {
                    return PartialView("MostrarCotizaciones", almacen.CotizacionSet.Where(cot =>  cot.status.Equals(Status.plantilla) && cot.status.Equals(status) && !cot.eliminado && cot.Usuario.activo).ToList<Cotizacion>());
                }
            
            
            };


            if (!form.Get("accion").Equals("nuevaCotPlantilla"))
            {
                return PartialView("MostrarCotizaciones", almacen.CotizacionSet.Where(cot => cot.Usuario.cod_usuario == idusuario && !cot.status.Equals(Status.plantilla) && cot.status.Equals(status) && !cot.eliminado && cot.Usuario.activo).OrderByDescending(cot => cot.Id).ToList<Cotizacion>());
            }
            else
            {
                return PartialView("MostrarCotizaciones", almacen.CotizacionSet.Where(cot => cot.Usuario.cod_usuario == idusuario && cot.status.Equals(Status.plantilla) && cot.status.Equals(status) && !cot.eliminado && cot.Usuario.activo).ToList<Cotizacion>());
            }
        }

        public ActionResult PreviewCot(Int32 id)
        {
            Session.Add("lastAction", "PreviewCot");
            Session.Add("datalastAction", id);
            
            try
            {
                Cotizacion cotPreview = almacen.CotizacionSet.Where(cot => !cot.eliminado && cot.Id == id).Single<Cotizacion>();

                Cliente elCliente = (cotPreview.Cliente == null) ? new Cliente() : cotPreview.Cliente;

                vistaCotizacion alaVista = new vistaCotizacion
                                                {
                                                    nueva = cotPreview,
                                                    nuevoCliente = elCliente
                                                };

                int idusuario = (int)Session["usuarioID"];
                ViewBag.datos = almacen.UsuarioSet.Where(usu => usu.cod_usuario == idusuario).Single<Usuario>();
                return View(alaVista);
            }catch(NullReferenceException)
            { return RedirectToAction("Index", "Home"); }
        }

        public String SubirImagenes(FormCollection form)
        {
            Int32 idCot = Int32.Parse(form.Get("IdCot"));
            Recurso nuevoRecurso = new Recurso();
            nuevoRecurso.cod_empresa = (int)Session["empresaID"];
            nuevoRecurso.Cotizacion = almacen.CotizacionSet.Where(cot => cot.Id == idCot).Single<Cotizacion>();
            HttpPostedFileBase temp = null;
            String dirtemp = "";
            foreach (string inputTagName in Request.Files)
            {
                HttpPostedFileBase file = Request.Files[inputTagName];
                temp = file;
                if (file.ContentLength > 0)
                {
                    string filePath = Path.Combine(HttpContext.Server.MapPath("~/Content/Recursos/cotizacion" + idCot), Path.GetFileName(file.FileName));
                    dirtemp = filePath;
                    file.SaveAs(filePath);
                }

            }
            nuevoRecurso.direccion = "/Content/Recursos/cotizacion" + idCot + "/" + Path.GetFileName(temp.FileName);
            nuevoRecurso.cod_clasificacion = 1;
            nuevoRecurso.solo_usado_en_tipo = 1;
            nuevoRecurso.solo_usado_en_cod = 0;
            nuevoRecurso.tipo = 1;
            nuevoRecurso.nombre = temp.FileName;

            almacen.RecursoSet.AddObject(nuevoRecurso);
            almacen.SaveChanges();

            ResultadoImagen resumenImagen = new ResultadoImagen
            {

                name = Path.GetFileName(temp.FileName),
                size = temp.ContentLength,
                type = temp.ContentType,
                url = Path.Combine(HttpContext.Server.MapPath("~/Content/Recursos/"), Path.GetFileName(temp.FileName)),
                delete = "DELETE",
                delete_url = ""
            };

            JsonResult temp2 = new JsonResult { Data = resumenImagen };
            return "[" + new JavaScriptSerializer().Serialize(temp2.Data) + "]";
        }

        public ActionResult VistaCotPDF(Int32 id)
        {
            try
            {
                ControllerContext context = this.ControllerContext;

                Cotizacion cotPreview = almacen.CotizacionSet.Where(cot => !cot.eliminado && cot.Id == id).Single<Cotizacion>();
                Cliente elCliente = (cotPreview.Cliente == null) ? new Cliente() : cotPreview.Cliente;
                int idusuario = (int)Session["usuarioID"];
                ViewBag.descripcion = ViewBag.descripcion = almacen.UsuarioSet.Where(usu => usu.cod_usuario == idusuario).Single<Usuario>().descripcion;
                vistaCotizacion alaVista = new vistaCotizacion
                {
                    nueva = cotPreview,
                    nuevoCliente = elCliente
                };

                context.Controller.ViewData.Model = alaVista;

                byte[] buf = null;

                MemoryStream pdfTemp = new MemoryStream();

                ViewEngineResult result = ViewEngines.Engines.FindPartialView(context, "PreviewCot2");

                if (result.View != null)
                {

                    string htmlTextView = GetViewToString(context, result);

                    iTextSharp.text.Document doc = new iTextSharp.text.Document();

                    iTextSharp.text.pdf.PdfWriter writer =

                    iTextSharp.text.pdf.PdfWriter.GetInstance(doc, pdfTemp);

                    writer.CloseStream = false;

                    doc.Open();

                    /*doc.Add(new iTextSharp.text.Paragraph(DateTime.Now.ToString()));*/

                    AddHTMLText(doc, htmlTextView);

                    doc.Close();



                    buf = new byte[pdfTemp.Position];

                    pdfTemp.Position = 0;

                    pdfTemp.Read(buf, 0, buf.Length);

                }

                return File(buf, "application/pdf", "InformeCotizacion" + id + ".pdf");
            }
            catch (NullReferenceException) {
                return RedirectToAction("Index", "Home");
            }
        }

        private string GetViewToString(ControllerContext context, ViewEngineResult result)
        {

            string viewResult = "";

            ViewDataDictionary viewData = new ViewDataDictionary();

            viewData.Model = context.Controller.ViewData.Model;

            TempDataDictionary tempData = new TempDataDictionary();

            StringBuilder sb = new StringBuilder();

            using (StringWriter sw = new StringWriter(sb))
            {

                using (HtmlTextWriter output = new HtmlTextWriter(sw))
                {

                    ViewContext viewContext = new ViewContext(context, result.View, viewData, tempData, output);

                    result.View.Render(viewContext, output);

                }

                viewResult = sb.ToString();

            }

            return viewResult;

        }

        private void AddHTMLText(iTextSharp.text.Document doc, string html)
        {

            List<iTextSharp.text.IElement> htmlarraylist = HTMLWorker.ParseToList(new StringReader(html), null);
            foreach (var item in htmlarraylist)
            {
                doc.Add(item);
            }
        }

        public ActionResult EditarCotizacion(Int32 id)
        {
            try
            {
                ViewBag.editar = "si";
                int anio = DateTime.Now.Year;
                List<SelectListItem> nuevo = new List<SelectListItem>();
                for (int i = 0; i < 6; i++)
                {
                    nuevo.Add(new SelectListItem() { Text = "" + (anio + i), Value = "" + (anio + i) });
                }
                ViewBag.destinos = almacen.DestinoSet.OrderBy(a => a.num_destino).ToList<Destino>();
                ViewBag.temporadas = almacen.TemporadaSet.ToList<Temporada>();
                ViewBag.anios = nuevo;
                Cotizacion actual = almacen.CotizacionSet.Where(co => co.Id == id).Single<Cotizacion>();
                vistaCotizacion edit_cotizacion = new vistaCotizacion();
                edit_cotizacion.nueva = actual;
                //Aqui colocamos la informacion del asesor
                int idusuario = (int)Session["usuarioID"];
                edit_cotizacion.nueva.Usuario = almacen.UsuarioSet.Where(usu => usu.cod_usuario == idusuario).Single<Usuario>();
                edit_cotizacion.nuevoCliente = (actual.Cliente == null) ? new Cliente() : actual.Cliente;
                return View("nueva", edit_cotizacion);
            }
            catch (NullReferenceException)
            {
                return RedirectToAction("Index", "Home");
            }
        }

        public ActionResult nuevoCliente()
        {
            Cliente actual = new Cliente();
            return PartialView(actual);
        }

        public JavaScriptResult registrarCliente(Cliente actual)
        {
            try
            {
                almacen.ClienteSet.AddObject(actual);
                almacen.SaveChanges();
                return JavaScript("$('#status').html('<h5 style=\"color:green;\">Creado satisfactoriamente el cliente: " + actual.Nombre + " </h5>');$('#clienteID').val('" + actual.Id + "');");
            }
            catch (Exception)
            {
                return JavaScript("$('#status').html('<h5 style=\"color:red;\">Error al cargar el cliente: " + actual.Nombre + " </h5>');");
            }
        }

        public String formatear()
        {
            Int16 id = Int16.Parse(this.Request.QueryString.Get("id"));
            Cotizacion esFormateable = almacen.CotizacionSet.Where(cot => cot.Id == id).Single<Cotizacion>();
            if (esFormateable.formateado)
                return "si";
            else
                return "no";
        }

        public ActionResult nuevaCotPlantilla()
        {
            Session.Add("accion", "nuevaCotPlantilla");
            int anio = DateTime.Now.Year;
            List<SelectListItem> nuevo = new List<SelectListItem>();
            for (int i = 0; i < 6; i++)
            {
                nuevo.Add(new SelectListItem() { Text = "" + (anio + i), Value = "" + (anio + i) });
            }
            ViewBag.destinos = almacen.DestinoSet.OrderBy(a => a.num_destino).ToList<Destino>();
            ViewBag.temporadas = almacen.TemporadaSet.ToList<Temporada>();
            ViewBag.anios = nuevo;
            ViewBag.asesores = almacen.UsuarioSet.ToList<Usuario>();

            return View("Index");
        }

        public ActionResult CotPlantilla(Int32 id)
        {
            Session.Add("accion", "CotPlantilla");
            try
            {
                int idUsuario = (int)Session["usuarioID"];
                int anio = DateTime.Now.Year;
                List<SelectListItem> nuevo = new List<SelectListItem>();
                for (int i = 0; i < 6; i++)
                {
                    nuevo.Add(new SelectListItem() { Text = "" + (anio + i), Value = "" + (anio + i) });
                }
                ViewBag.destinos = almacen.DestinoSet.OrderBy(a => a.num_destino).ToList<Destino>();
                ViewBag.temporadas = almacen.TemporadaSet.ToList<Temporada>();
                ViewBag.anios = nuevo;
                ViewBag.asesores = almacen.UsuarioSet.ToList<Usuario>();
                vistaCotizacion actual = new vistaCotizacion();
                Cotizacion final = new Cotizacion();
                Cotizacion buscar = almacen.CotizacionSet.Where(cot => cot.Id == id).Single<Cotizacion>();

                final.Cliente = buscar.Cliente;
                final.descripcion_html = buscar.descripcion_html;
                final.Destino = buscar.Destino;
                final.observaciones = buscar.observaciones;
                final.precio_referencial = buscar.precio_referencial;
                final.status = buscar.status;
                final.Temporada = buscar.Temporada;
                final.texto_intro = buscar.texto_intro;
                final.titulo_cotizacion = buscar.titulo_cotizacion;
                final.Usuario = almacen.UsuarioSet.Where(usu => usu.cod_usuario == idUsuario).Single<Usuario>();
                final.year = buscar.year;
                final.incluye = buscar.incluye;
                final.noincluye = buscar.noincluye;
                final.eliminado = false;
                final.fecha = DateTime.Now;
                final.fecha_inicio = buscar.fecha_inicio;
                final.fecha_fin = buscar.fecha_fin;
                final.noches = buscar.noches;
                final.formateado = buscar.formateado;
                final.eshijode = buscar.Id;
                final.imagenes_adicionales = buscar.imagenes_adicionales;

                actual.nueva = final;
                actual.nueva.status = Status.borrador;
                actual.nuevoCliente = (actual.nueva.Cliente == null) ? new Cliente() : actual.nuevoCliente;

                return View("nueva", actual);
            }
            catch (NullReferenceException) {
                return RedirectToAction("Index", "Home");
            }
        }

        public ActionResult filtrartitulo(FormCollection form)
        {
            Session.Add("filtro", "si");
            List<Cotizacion> plantillas = almacen.CotizacionSet.Where(cot => cot.status.Equals(Status.plantilla) && !cot.eliminado && cot.Usuario.activo).OrderByDescending(cot => cot.Id).ToList<Cotizacion>();
            int anio = DateTime.Now.Year;
            List<SelectListItem> nuevo = new List<SelectListItem>();
            for (int i = 0; i < 6; i++)
            {
                nuevo.Add(new SelectListItem() { Text = "" + (anio + i), Value = "" + (anio + i) });
            }
            ViewBag.destinos = almacen.DestinoSet.OrderBy(a => a.num_destino).ToList<Destino>();
            ViewBag.temporadas = almacen.TemporadaSet.ToList<Temporada>();
            ViewBag.anios = nuevo;
            ViewBag.asesores = almacen.UsuarioSet.ToList<Usuario>();

            if (!String.IsNullOrEmpty(form.Get("titulo")))
            {
                var titulo = form.Get("titulo");
                if (!form.Get("accion").Equals("nuevaCotPlantilla"))
                {

                    return PartialView("MostrarCotizaciones", almacen.CotizacionSet.Where(cot => !cot.status.Equals(Status.plantilla) && cot.titulo_cotizacion.Contains(titulo) && !cot.eliminado).OrderByDescending(cot => cot.Id).ToList<Cotizacion>());
                }
                else
                {

                    return PartialView("MostrarCotizacionesPlantilla", almacen.CotizacionSet.Where(cot => cot.status.Equals(Status.plantilla) && cot.titulo_cotizacion.Contains(titulo) && !cot.eliminado).OrderByDescending(cot => cot.Id).ToList<Cotizacion>());
                }
            }
            else
            {

                if (!form.Get("accion").Equals("nuevaCotPlantilla"))
                {

                    return PartialView("MostrarCotizaciones", almacen.CotizacionSet.Where(cot => !cot.status.Equals(Status.plantilla) && !cot.eliminado).OrderByDescending(cot => cot.Id).ToList<Cotizacion>());
                }
                else
                {

                    return PartialView("MostrarCotizacionesPlantilla", almacen.CotizacionSet.Where(cot => cot.status.Equals(Status.plantilla) && !cot.eliminado).OrderByDescending(cot => cot.Id).ToList<Cotizacion>());
                }

            }
        }

        public ActionResult FiltrarId(FormCollection form)
        {
            Session.Add("filtro", "si");
            int elId = int.Parse(form.Get("id"));
            List<Cotizacion> nuevaCot = new List<Cotizacion>();
            Cotizacion actual = almacen.CotizacionSet.Where(cot => cot.Id == elId && !cot.eliminado && cot.Usuario.activo).FirstOrDefault<Cotizacion>();
            int anio = DateTime.Now.Year;
            List<SelectListItem> nuevo = new List<SelectListItem>();
            for (int i = 0; i < 6; i++)
            {
                nuevo.Add(new SelectListItem() { Text = "" + (anio + i), Value = "" + (anio + i) });
            }
            ViewBag.destinos = almacen.DestinoSet.OrderBy(a => a.num_destino).ToList<Destino>();
            ViewBag.temporadas = almacen.TemporadaSet.ToList<Temporada>();
            ViewBag.anios = nuevo;
            ViewBag.asesores = almacen.UsuarioSet.ToList<Usuario>();

            if (actual != null)
            {
                nuevaCot.Add(actual);
            }
            else
            {
                return View("MostrarCotizaciones", nuevaCot);
            }

            if (!actual.status.Equals(Status.aprobado) && !actual.status.Equals(Status.plantilla))
            {

                return View("MostrarCotizaciones", nuevaCot);
            }
            else
            {
                return View("MostrarCotizacionesPlantilla", nuevaCot);
            }

        }

        public ActionResult FiltrarStatus(FormCollection form)
        {
            Session.Add("filtro", "si");
            String status = form.Get("status");
            List<Cotizacion> nuevaCot = almacen.CotizacionSet.Where(cot => cot.status == status && !cot.eliminado && cot.Usuario.activo).ToList<Cotizacion>();
            int anio = DateTime.Now.Year;
            List<SelectListItem> nuevo = new List<SelectListItem>();
            for (int i = 0; i < 6; i++)
            {
                nuevo.Add(new SelectListItem() { Text = "" + (anio + i), Value = "" + (anio + i) });
            }
            ViewBag.destinos = almacen.DestinoSet.OrderBy(a => a.num_destino).ToList<Destino>();
            ViewBag.temporadas = almacen.TemporadaSet.ToList<Temporada>();
            ViewBag.anios = nuevo;
            ViewBag.asesores = almacen.UsuarioSet.ToList<Usuario>();

            if (!form.Get("status").Equals(Status.plantilla))
            {

                return PartialView("MostrarCotizaciones", nuevaCot);
            }
            else
            {
                return PartialView("MostrarCotizacionesPlantilla", nuevaCot);
            }

        }

        public ActionResult Eliminar(Int32 id)
        {

            Cotizacion findit = almacen.CotizacionSet.Where(cot => cot.Id == id).Single<Cotizacion>();
            findit.eliminado = true;
            almacen.SaveChanges();
            return RedirectToAction("Index", "Cotizacion");
        }

        public ActionResult Enviar(Int32 id)
        {
            Cotizacion aEnviar = almacen.CotizacionSet.Where(cot => cot.Id == id).Single<Cotizacion>();
            aEnviar.status = Status.enviado;
            if (TryUpdateModel(aEnviar))
            {
                almacen.SaveChanges();
            }

            //Creo la plantilla a partir de lo enviado previamente
            {


                //agrego primero las caracteristicas que la hacen
                //ser una plantilla
                Cotizacion plantilla = new Cotizacion();
                plantilla.status = Status.plantilla;
                plantilla.descripcion_html = aEnviar.descripcion_html;
                plantilla.Destino = aEnviar.Destino;
                plantilla.observaciones = aEnviar.observaciones;
                plantilla.precio_referencial = aEnviar.precio_referencial;
                plantilla.Temporada = aEnviar.Temporada;
                plantilla.texto_intro = aEnviar.texto_intro;
                plantilla.titulo_cotizacion = aEnviar.titulo_cotizacion;
                plantilla.Usuario = aEnviar.Usuario;
                plantilla.year = aEnviar.year;
                plantilla.incluye = aEnviar.incluye;
                plantilla.noincluye = aEnviar.noincluye;
                plantilla.eliminado = false;
                plantilla.fecha = DateTime.Now;
                plantilla.noches = aEnviar.noches;
                plantilla.formateado = aEnviar.formateado;
                plantilla.imagenes_adicionales = aEnviar.imagenes_adicionales;
                plantilla.Id = 0;
                almacen.CotizacionSet.AddObject(plantilla);
                almacen.SaveChanges();

                //Perfecto!
                aEnviar.eshijode = plantilla.Id;
                almacen.SaveChanges();

            }

            ControllerContext context = this.ControllerContext;
            vistaCotizacion toContext = new vistaCotizacion
            {
                nueva = aEnviar,
                nuevoCliente = aEnviar.Cliente
            };


            context.Controller.ViewData.Model = toContext;
            ViewEngineResult result = ViewEngines.Engines.FindPartialView(context, "PreviewCot2");
            string htmlTextView = GetViewToString(context, result);
            WebMail.Send(aEnviar.Cliente.email, "PASSARINI SUAREZ CONFIRMACION DE COTIZACION", htmlTextView);

            ViewBag.pregunta = "¿Por qué demoró 24 Horas en enviar la cotización?";
            int anio = DateTime.Now.Year;
            List<SelectListItem> nuevo = new List<SelectListItem>();
            for (int i = 0; i < 6; i++)
            {
                nuevo.Add(new SelectListItem() { Text = "" + (anio + i), Value = "" + (anio + i) });
            }
            ViewBag.destinos = almacen.DestinoSet.OrderBy(a => a.num_destino).ToList<Destino>();
            ViewBag.temporadas = almacen.TemporadaSet.ToList<Temporada>();
            ViewBag.anios = nuevo;
            ViewBag.asesores = almacen.UsuarioSet.ToList<Usuario>();

            return View("comentario", aEnviar);
        }

        public ActionResult Aprobar(Int32 id)
        {
            Cotizacion actual = almacen.CotizacionSet.Where(cot => cot.Id == id).Single<Cotizacion>();
            actual.status = Status.aprobado;
            if (TryUpdateModel(actual))
            {
                almacen.SaveChanges();
            }
            ViewBag.pregunta = "Coloque el numero de anticipo";
            return View("comentario", actual);
        }

        public ActionResult Rechazar(Int32 id)
        {
            Cotizacion actual = almacen.CotizacionSet.Where(cot => cot.Id == id).Single<Cotizacion>();

            actual.status = Status.rechazado;

            if (TryUpdateModel(actual))
            {
                almacen.SaveChanges();
            }

            ViewBag.pregunta = "¿Cuál fue el motivo por el cual fue rechazada?";

            return View("comentario", actual);
        }

        [HttpPost]
        public ActionResult ConfirmarStatus(Cotizacion actual)
        {
            Cotizacion buscar = almacen.CotizacionSet.Where(act => act.Id == actual.Id).Single<Cotizacion>();
            if (TryUpdateModel(buscar))
            {
                almacen.SaveChanges();
            }

            return RedirectToAction("Index", "Cotizacion");
        }

        public String SubirArchivo(FormCollection form) {

            var path = " ";

            HttpPostedFileBase file = this.Request.Files[0];

            path = Path.Combine(Server.MapPath("~/Content/Recursos/web/"), Path.GetFileName(file.FileName));
            
            file.SaveAs(path);

            //String an= "{ \"error\": Info del error, \"msg\": exito, \"web\": http://" + Request.Url.Authority + "/Content/Recursos/web/" + file.FileName + " }";

            String direccion = "http://" + Request.Url.Authority + "/Content/Recursos/web/" + file.FileName;
            direccion =direccion.Replace("localhost", Request.UserHostAddress);
            

            return direccion;
        }


        public ActionResult EnvioMasivo()
        {
            var id = int.Parse(this.Request.Form.Get("cotizacion"));
            String correos = (String)this.Request.Form.Get("correos");

            String[] correos2 = correos.Split(',');

            Cotizacion aEnviar = almacen.CotizacionSet.Where(cot => cot.Id == id).Single<Cotizacion>();

            ControllerContext context = this.ControllerContext;
            vistaCotizacion toContext = new vistaCotizacion
            {
                nueva = aEnviar,
                nuevoCliente = aEnviar.Cliente
            };


            context.Controller.ViewData.Model = toContext;
            ViewEngineResult result = ViewEngines.Engines.FindPartialView(context, "PreviewCot2");
            string htmlTextView = GetViewToString(context, result);


            foreach (var data in correos2)
            {
                WebMail.Send(data, "PASSARINI SUAREZ CONFIRMACION DE COTIZACION", htmlTextView);
            }

            return Content("<h5>Enviados correctamente: "+correos2.Length+" correos</h5>","text/html");
        }

    }


}
